home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / t_os / gpen32k / source.exe / LIB / OSRC / MENU256.C < prev    next >
C/C++ Source or Header  |  1993-06-15  |  5KB  |  236 lines

  1. /*
  2.             Towns Menu-Bar 256 v0.001
  3.                             Copyright(C) 1993 Okome
  4. */
  5.  
  6. #include <string.h>
  7. #include <EGB.H>
  8. #include <MOS.H>
  9. #include <normlib.h>
  10. #include <okome.h>
  11.  
  12. #define col0    0
  13. #define col1    102
  14. #define col2    2
  15. #define col3    3
  16. #define col4    4
  17. #define col5    5
  18. #define col6    6
  19. #define col7    109
  20. #define col8    0
  21. #define col9    9
  22. #define col10    10
  23. #define col11    11
  24. #define col12    12
  25. #define col13    13
  26. #define col14    14
  27. #define col15    255
  28.  
  29. extern char work[];
  30. extern char *MEN_title[];
  31. extern int MEN_kazu[];
  32. static int mex[16], mel[16], ebf;
  33.  
  34. static int ml( int i )
  35. {
  36.     int k, l=0;
  37.     for (k=0; k<=i; k++)
  38.         l+=MEN_kazu[k];
  39.     return (l);
  40. }
  41.  
  42. static int ubs( int i, int m )
  43. {
  44.     static int j=-1, n=0;
  45.     int k, l, y;
  46.     char b[640];
  47.     if (j != i)
  48.     {
  49.         if (j >= 0)
  50.         {
  51.             ubox2( mex[j], 0, mex[j+1]-1, 19, col15, col8 );
  52.             for ( y=20; y<=23+MEN_kazu[j+1]*19; y++ )
  53.             {
  54.                 egbget( 640, y, 640+mel[j], y, b);
  55.                 egbput( mex[j], y, mex[j]+mel[j], y, b);
  56.             }
  57.         }
  58.         j = i;
  59.         n = 0;
  60.         if (i >= 0)
  61.         {
  62.             ubox2( mex[i], 0, mex[i+1]-1, 19, (i!=0)*col1, (i!=0)*col1 );
  63.             for ( y=20; y<=23+MEN_kazu[i+1]*19; y++ )
  64.             {
  65.                 egbget( mex[j], y, mex[j]+mel[j], y, b);
  66.                 egbput( 640, y, 640+mel[j], y, b);
  67.             }
  68.             boxbf( mex[i], 20, mex[i]+mel[i], 23+MEN_kazu[i+1]*19, col8,col15);
  69.             boxb( mex[i], 20, mex[i]+mel[i]-1, 22+MEN_kazu[i+1]*19, col8 );
  70.             boxb( mex[i], 20, mex[i]+mel[i]-2, 21+MEN_kazu[i+1]*19, col8 );
  71.             l = ml(i);
  72.             for (k=0; k<MEN_kazu[i+1]; k++)
  73.             {
  74.                 symbol( mex[i]+8, 37+k*19, MEN_title[l+k], 16, col8 );
  75.             }
  76.         }
  77.     }
  78.     if ( i>=0 )
  79.     {
  80.         if ( m!=n )
  81.         {
  82.             EGB_writeMode( work, 4 );
  83.             if (n>0)
  84.             {
  85.                 boxf( mex[i]+1, n*19+2, mex[i]+mel[i]-3, n*19+20, col15 );
  86.             }
  87.             if (m>0)
  88.             {
  89.                 boxf( mex[i]+1, m*19+2, mex[i]+mel[i]-3, m*19+20, col15 );
  90.             }
  91.             EGB_writeMode( work, 0 );
  92.             n = m;
  93.         }
  94.         if (m > 0)
  95.         {
  96.             return (i*100+m);
  97.         }
  98.     }
  99.     return (0);
  100. }
  101.  
  102. static int menx(int mx)
  103. {
  104.     int i = 1;
  105.     while ( mex[i] <= mx )
  106.         i++;
  107.     return (i-1);
  108. }
  109.  
  110. static int mebox( int mb, int k )
  111. {
  112.     int i = 0, j, mx, my, l;
  113.     l = k*23;
  114.     while (mb != 0)
  115.     {
  116.         MOS_rdpos( &mb, &mx, &my );
  117.         j=i;
  118.         i = ( mx >= 610-l && mx <=629-l && my < 20 ) ? 1 : 0 ;
  119.         if (j!=i)
  120.         {
  121.             MOS_disp( 0 );
  122.             ubox2( 610-l, 0, 629-l, 19, 255-i*255, col8 );
  123.             MOS_disp( 1 );
  124.         }
  125.     }
  126.     MOS_disp( 0 );
  127.     ubox2( 610-l, 0, 629-l, 19, col15, col8 );
  128.     MOS_disp( 1 );
  129.     return (i);
  130. }
  131.  
  132. int MEN_menu256( int mb, int mx, int my )
  133. {
  134.     int p, i, r = 0, j = -1, z = 1, mb2;
  135.     p = EGB_getWritePage( 0, 0 );
  136.     EGB_writePage( work, 0 );
  137.     if ( mb && mex[MEN_kazu[0]] > mx && my < 20 )
  138.     {
  139.         while ( z != 0 )
  140.         {
  141.             mb2 = mb;
  142.             MOS_rdpos( &mb, &mx, &my );
  143.             if ( mex[MEN_kazu[0]] > mx && my < 20 )
  144.             {
  145.                 if ( mb )
  146.                 {
  147.                     i = menx(mx);
  148.                     if ( j!=i || r )
  149.                     {
  150.                         MOS_disp( 0 );
  151.                         r = ubs( i, 0 );
  152.                         MOS_disp( 1 );
  153.                         j = i;
  154.                     }
  155.                     z = 2;
  156.                 }    else    {
  157.                     z = 1;
  158.                 }
  159.             }
  160.             if ( mex[j] <= mx && mex[j]+mel[j] >= mx &&
  161.                  20 < my && my < 21 + MEN_kazu[j+1] * 19 )
  162.             {
  163.                 if (mb!=0)
  164.                 {    /*    SUB menuの処理    */
  165.                     i = (my - 21) / 19;
  166.                     MOS_disp( 0 );
  167.                     r = ubs( j, i+1 );
  168.                     MOS_disp( 1 );
  169.                     z = 3;
  170.                 }    else    {
  171.                     if ( z==3 && mb2 )
  172.                     {
  173.                         z = 0;
  174.                     }
  175.                 }
  176.             }    else    {
  177.                 if ( z==3 && mb )
  178.                 {
  179.                     MOS_disp( 0 );
  180.                     r = ubs(j, 0);
  181.                     MOS_disp( 1 );
  182.                     z = 4;
  183.                 }
  184.                 if ( (mex[MEN_kazu[0]] > mx && my < 20)==0 )
  185.                 {
  186.                     if (((z==1) && mb) || ((z==2 || z==4) && mb==0))
  187.                     {
  188.                         z = 0;
  189.                     }
  190.                 }
  191.             }
  192.         }
  193.         MOS_disp( 0 );
  194.         ubs( -1, 0 );
  195.         MOS_disp( 1 );
  196.         do    {
  197.             MOS_rdpos( &mb, &mx, &my );
  198.         }    while( mb != 0 );
  199.     }    else    {
  200.         if ( mx >= 633-23*ebf && mx <= 629 && my < 20 && (629-mx) % 23 < 20)
  201.         {    /*    ENDボタン    */
  202.             i = (629-mx) / 23;
  203.             if (mebox( mb, i ))
  204.                 r = 9999 - i;
  205.         }
  206.     }
  207.     EGB_writePage( work, p );
  208.     return (r);
  209. }
  210.  
  211. void MEN_set256( int b )
  212. {
  213.     int i, j=0, k, l;
  214.     boxbf( 0, 0, 639, 19, 0, col7 );
  215.     ebf = b;
  216.     for (i = 0; i < MEN_kazu[0]; i++)
  217.     {
  218.         j += strlen(MEN_title[i])*8+32;
  219.         mex[i+1] = j;
  220.         boxf( mex[i], 0, j-1, 19, (i!=0)*col1 );
  221.         ubox2( mex[i], 0, j-1, 19, col15, col8 );
  222.         symbol( mex[i]+13, 17, MEN_title[i], 16, col15 );
  223.         l = ml(i);
  224.         for (k=0; k<MEN_kazu[i+1]; k++)
  225.         {
  226.             if ( strlen(MEN_title[l+k])*8+16 > mel[i] )
  227.                 mel[i] = strlen(MEN_title[l+k])*8+18;
  228.         }
  229.     }
  230.     for (i = 0; i < b; i++)
  231.     {
  232.         boxf( 610-i*23, 0, 629-i*23, 19, col8 );
  233.         ubox2( 610-i*23, 0, 629-i*23, 19, col15, col8 );
  234.     }
  235. }
  236.